# 堆排序（Heap Sort）—— 手撕算法题！
"""
基本思路
    • 建最大堆
    • 把堆顶元素放到数组末尾，重新堆化
"""


def heapify(arr, n, i):
    """维护堆的性质"""
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2

    if left < n  and arr[left] > arr[largest]:
        largest = left

    if right < n and arr[right] > arr[largest]:
        largest = right

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)


def heap_sort(arr):
    n = len(arr)

    # 建堆
    for i in range( n // 2 -1, -1, -1):
        heapify(arr, n, i)

    # 取堆顶元素，放到末尾
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]     # 堆顶与当前末尾交换
        heapify(arr, i, 0)


# 测试
arr = [4,10,3,5,1]
heap_sort(arr)
print(arr)